<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\LinkStoreRequest;
use App\Http\Controllers\Api\CommonApi;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;

/**
 * 处理友情链接相关的增删改查
 * @author guoguo<[gaymbiu@163.com]>
 */
class AdminLinkController extends Controller
{
    /**
     * 显示友链列表主页面
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //展示列表页面之前先从数据库查出链接数据并且分页
        $res = DB::table('shop_links')->select('id', 'picurl', 'name', 'link')->orderBy('id')->paginate(5);

        //将数据带到页面并且遍历展示
        return view('Admin/link/link-list', ['res' =>$res]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function addIndex()
    {
        return view('Admin/link/link-add');
    }

    /**
     * Store a newly created resource in storage.
     *处理新增友链的输入信息
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(LinkStoreRequest $request)
    {

        //插入前先看redis中是否有5个友链，已经有5个就不再继续插入了，因为友链页面空间有限
        $linksArray = Redis::sMembers('links');
        $num = count($linksArray);
        if ($num  > 4) {
            return back()->with('message', 'redis中已经有5个链接，请先删除列表中的一个链接再插入');
        }

        //实例化七牛云上传类
        $common = new CommonApi;

        //接收form表单传递过来的数据
        $linkname = $request->input('linkname');
        $url = $request->input('url');
        $res = $common->uploadToQiNiu($request, 'picurl');

        //判断从七牛返回的数据状态
        if ($res['status'] == 4403) {
            return back()->with('message', '没有选择文件');
        }
        if ($res['status'] == 4401) {
            return back()->with('message', '上传文件不合法');
        }
        if ($res['status'] == 4044) {
            return back()->with('message', '上传超时，请稍候再试');
        }

        //走到这里说明图片上传7牛成功，提取返回的图片名
        $pic = $res['data']['key'];

        //将表单的数据插入数据库
        $id = DB::table('shop_links')->insertGetId(
            ['picurl' => $pic, 'name' => $linkname, 'link' => $url]
        );
        //判断是否插入成功
        if (!$id) {
            return back()->with('message', '插入数据库失败');
        }

        // 走到这里就把友链的数据插入redis
        Redis::sAdd('links', $id);
        Redis::hMset('linksId_'.$id, 'url', $url, 'qiNiuPic', $pic, 'name', $linkname);

        return redirect()->route('linkadd')->with('message', '添加成功');
    }

    /**
     * Display the specified resource.
     * 这个方法用来显示搜索结果并且分页的
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request)
    {
        //获取搜索框的文本内容,根据内容查数据库
        $content = $request->input('content');
        $res = DB::table('shop_links')->select('id', 'picurl', 'name', 'link')->where('name', 'like', '%'.$content.'%')->orderBy('id')->paginate(5);

        return view('Admin/link/link-list', ['res' =>$res, 'keyword' => $content]);
    }

    /**
     * Show the form for editing the specified resource.
     * 通过get方法传递id并从数据库查出修改之前的数据显示在编辑页面
     * @param  int  $id鼠标点击的该条友链的id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //判断$id是否合法
        if (intval($id) < 1) {
            return back();
        }

        //根据$id查询数据库并传递给编辑页面
        $res = DB::table('shop_links')->select('id', 'name', 'link', 'picurl')->find($id);
        if (empty($res)) {
            return back()->with('message', '数据库暂无该条数据');
        };
        return view('Admin/link/link-edit', ['res' => $res]);
    }


    /**
     * Update the specified resource in storage.
     *获取管理员修改友链提交的数据
     * @param  \Illuminate\Http\Request  $request从表单传递过来的参数
     * @param  int  $id该条友链的id
     * @return \Illuminate\Http\Response
     */
    public function update(LinkStoreRequest $request, $id)
    {
        $common = new CommonApi;

        $linkname = $request->input('linkname');
        $url = $request->input('url');

        //先判断是否上传了新图片,没上传就只修改文字类数据
        if (!$request->file('picurl')) {
            $res = DB::table('shop_links')->where('id', $id)->update([
                'name' => $linkname,
                'link' => $url,
            ]);

            //判断是否有更改过数据
            if ($res == 0) {
                return back()->with('message', '数据没有任何变化');
            }

            //走到这里说明文字数据更改成功，就顺带把redis里面的数据也修改
            Redis::hMset('linksId_'.$id, 'url', $url, 'name', $linkname);
            return back()->with('message', '编辑成功');
        }

        //走到这里说明有添加新图片，在上传新图片之前先删掉七牛云上的旧图片
        $common->deleteToQiNiu('shop_links', 'picurl', $id);

        //上传新图片
        $newpic = $common->uploadToQiniu($request, 'picurl');

        //判断从七牛返回的数据状态
        if ($newpic['status'] == 4403) {
            return back()->with('message', '没有选择文件');
        }
        if ($newpic['status'] == 4401) {
            return back()->with('message', '上传文件不合法');
        }
        if ($newpic['status'] == 4044) {
            return back()->with('message', '上传失败，请稍候再试');
        }

        //来到这里说明图片上传成功，再拿到穿回来的图片名称，打包修改该条数据
        $pic = $newpic['data']['key'];
        $update = DB::table('shop_links')->where('id', $id)->update([
            'name' => $linkname,
            'link' => $url,
            'picurl' => $pic,
        ]);

        //判断修改数据库是否成功
        if ($update == 0) {
            return back()->with('message', '图片上传7牛OK但是插入数据库失败啦！联系管理员吧~');
        }

        //走到这里说明文字数据图片都更改成功，就顺带把redis里面的数据也修改
        Redis::hMset('linksId_'.$id, 'url', $url, 'qiNiuPic', $pic, 'name', $linkname);

        //走到这里说明万事OK
        return back()->with('message', '编辑成功~');
    }

    /**
     * Remove the specified resource from storage.
     * 通过AJAX传递过来的id删除数据库对应的数据
     * @param  $request AJAX传递过来的数据
     * @return \Illuminate\Http\Response
     */
    public function destroy(Request $request)
    {
        $id = $request->input('id');

        //必须先删除7牛上面的图片，再删mysql，因为mysql删了之后，该图片的id就没了
        $common = new CommonApi;
        $common->deleteToQiNiu('shop_links', 'picurl', $id);

        //走到这里拿到id后就删除数据库的该条数据
        $res = DB::table('shop_links')->where('id', $id)->delete();

        //判断是否删除成功
        if (!$res) {
            return response()->json([
                'status' => '404',
                'msg' => '删除失败,数据库没有这条数据',
            ]);
        }

        //删除redis中的数据该条友链的数据
        Redis::sRem('links', $id);
        Redis::del('linksId_'.$id);

        //数据库的数据和7牛的图片都删除成功，就返回正常状态码，删除页面上的数据
        return response()->json([
            'status' => '200',
            'msg' => '删除成功',
        ]);

    }
}
